#ifndef _IRQ_HPP_
#define _IRQ_HPP_
namespace irq
{
  void         irq0();
  void         irq1();
  void         irq2();
  void         irq3();
  void         irq4();
  void         irq5();
  void         irq6();
  void         irq7();
  void         irq8();
  void         irq9();
  void         irq10();
  void         irq11();
  void         irq12();
  void         irq13();
  void         irq14();
  void         irq15();
  static int   size(){return 16;}

  template <int index>
  static inline type::u32    intv_irq     ()  {return 0x0020+index;}

  static inline type::u32    intv_irq     (int index){return 0x0020+index;}
  
  static inline type::fptr   handler(int index) {
    type::fptr handlers[]={irq::irq0,irq::irq1,irq::irq2, irq::irq3, irq::irq4, irq::irq5, irq::irq6, irq::irq7,
                           irq::irq8,irq::irq9,irq::irq10,irq::irq11,irq::irq12,irq::irq13,irq::irq14,irq::irq15}; 
    return handlers[index];
  }
  
  static inline type::u32 ocw1_enable_one (int index)    {return ~(1<<index);}  //operation control word
  static inline type::u32 ocw1_enable_except(int index)  {return 1<<index;}
  static inline type::u32 ocw1_disable_all()    {return ~0;}
  void disable_irq                    (int index);
  void enable_irq                     (int index);
}
#endif
